const httpStatus = require('http-status');
const { User } = require('../models');
const ApiError = require('../utils/ApiError');
const moment = require('moment');

/**
 * 获取用户仪表盘统计摘要
 * @returns {Promise<object>}
 */
const getUserSummaryStats = async () => {
  // --- 总用户数 ---
  const totalUsersCount = await User.countDocuments({ isDeleted: false }); // 只统计未删除用户

  // --- 活跃用户数 (示例：过去30天内有登录记录的用户) ---
  // 注意：这需要 User 模型中有 lastLoginAt 字段，并且在用户登录时更新它。
  // 如果没有 lastLoginAt，可以暂时返回一个模拟值或基于其他标准计算。
  const thirtyDaysAgo = moment().subtract(30, 'days').toDate();
  const activeUsersCount = await User.countDocuments({ 
    isDeleted: false,
    lastLoginAt: { $gte: thirtyDaysAgo } 
  });
  // 模拟上月活跃用户数用于计算变化
  const previousMonthActiveUsersCount = Math.max(0, activeUsersCount - Math.floor(Math.random() * 50) + 10); // 示例随机值

  // --- 新增用户数 (示例：过去30天内创建的用户) ---
  const newUsersCount = await User.countDocuments({
    isDeleted: false,
    createdAt: { $gte: thirtyDaysAgo }
  });
  // 模拟上月新增用户数
  const previousMonthNewUsersCount = Math.max(0, newUsersCount - Math.floor(Math.random() * 20) + 5); // 示例随机值


  // --- 总用户数变化百分比 (与上个月比较，这里用模拟数据) ---
  // 实际项目中，您需要记录历史数据或通过快照来计算上个月的总用户数
  const previousMonthTotalUsersCount = Math.max(0, totalUsersCount - Math.floor(Math.random() * 100) + 20); // 示例随机值
  
  const calculateChange = (current, previous) => {
    if (previous === 0) {
      return current > 0 ? 100 : 0; // 如果上期为0，本期大于0则增长100%
    }
    return parseFloat((((current - previous) / previous) * 100).toFixed(1));
  };

  const getChangeDirection = (changePercentage) => {
    if (changePercentage > 0) return 'up';
    if (changePercentage < 0) return 'down';
    return 'steady';
  };

  const totalUsersChangePercentage = calculateChange(totalUsersCount, previousMonthTotalUsersCount);
  const activeUsersChangePercentage = calculateChange(activeUsersCount, previousMonthActiveUsersCount);
  const newUsersChangePercentage = calculateChange(newUsersCount, previousMonthNewUsersCount);
  
  // --- 增长率 (示例：本月新增用户 / 上月底总用户数) ---
  // 这里的 "上月底总用户数" 实际上是 "本月初总用户数 - 本月新增" 
  // 或者更准确的是，上一个统计周期结束时的总用户数。
  // 为简化，我们这里也使用模拟的上月总用户数。
  const growthRateCurrentPercentage = previousMonthTotalUsersCount > 0 
                                      ? parseFloat(((newUsersCount / previousMonthTotalUsersCount) * 100).toFixed(1))
                                      : (newUsersCount > 0 ? 100 : 0);

  // 模拟上月增长率用于计算变化点
  const previousMonthGrowthRatePercentage = Math.max(0, growthRateCurrentPercentage - Math.floor(Math.random() * 5) + 1);
  const growthRateChangePercentagePoint = parseFloat((growthRateCurrentPercentage - previousMonthGrowthRatePercentage).toFixed(1));


  return {
    totalUsers: {
      current: totalUsersCount,
      changePercentage: totalUsersChangePercentage,
      changeDirection: getChangeDirection(totalUsersChangePercentage),
    },
    activeUsers: {
      current: activeUsersCount,
      period: 'monthly', // 假设是月度活跃
      changePercentage: activeUsersChangePercentage,
      changeDirection: getChangeDirection(activeUsersChangePercentage),
    },
    newUsers: {
      current: newUsersCount,
      period: 'monthly',
      changePercentage: newUsersChangePercentage,
      changeDirection: getChangeDirection(newUsersChangePercentage),
    },
    growthRate: {
      currentPercentage: growthRateCurrentPercentage,
      period: 'monthly',
      changePercentagePoint: growthRateChangePercentagePoint,
      changeDirection: getChangeDirection(growthRateChangePercentagePoint),
    },
  };
};

module.exports = {
  getUserSummaryStats,
}; 